# CMake build for xerces-c
#
# Written by Roger Leigh <rleigh@codelibre.net>
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Run "cmake" to generate the build files for your platform

cmake_minimum_required(VERSION 3.12.0)

# Try C++17, then fall back to C++14, C++11 then C++98.  Used for feature tests
# for optional features.
set(CMAKE_CXX_STANDARD 17)

# Use folders (for IDE project grouping)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)

# Source additional modules from the "cmake" directory
list(APPEND CMAKE_MODULE_PATH
     "${CMAKE_CURRENT_LIST_DIR}/cmake")

# Read version information from configure.ac.
file(STRINGS "${CMAKE_CURRENT_LIST_DIR}/configure.ac" configure
     REGEX "^AC_INIT\\(\\[xerces-c\\],\\[(.*)\\]\\)")
foreach(line IN LISTS configure)
  string(REGEX REPLACE "^AC_INIT\\(\\[xerces-c\\],\\[(.*)\\]\\)" "\\1" xerces_c_version "${line}")
  break()
endforeach()
file(STRINGS "${CMAKE_CURRENT_LIST_DIR}/configure.ac" configure
     REGEX "^INTERFACE_VERSION=.*")
foreach(line IN LISTS configure)
  string(REGEX REPLACE "^INTERFACE_VERSION=(.*)" "\\1" xerces_c_interface_version "${line}")
  break()
endforeach()
file(STRINGS "${CMAKE_CURRENT_LIST_DIR}/configure.ac" configure
     REGEX "^GRAMMAR_SERIALIZATION_LEVEL=.*")
foreach(line IN LISTS configure)
  string(REGEX REPLACE "^GRAMMAR_SERIALIZATION_LEVEL=(.*)" "\\1" xerces_c_grammar_serialization_level "${line}")
  break()
endforeach()

message(STATUS "Configuring Apache Xerces-C++ version ${xerces_c_version}")

# Project version
project(xerces-c
        VERSION "${xerces_c_version}"
        LANGUAGES C CXX)
enable_testing()

# For autotools header compatibility
set(PACKAGE "${PROJECT_NAME}")
set(PACKAGE_NAME "${PROJECT_NAME}")
set(PACKAGE_TARNAME "${PROJECT_NAME}")
set(PACKAGE_VERSION "${PROJECT_VERSION}")
set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
set(PACKAGE_BUGREPORT "c-dev@xerces.apache.org")
set(PACKAGE_URL "https://xerces.apache.org/xerces-c/")

set(VERSION "${PROJECT_VERSION}")
set(XERCES_VERSION_MAJOR "${PROJECT_VERSION_MAJOR}")
set(XERCES_VERSION_MINOR "${PROJECT_VERSION_MINOR}")
set(XERCES_VERSION_REVISION "${PROJECT_VERSION_PATCH}")
string(REPLACE "." ";" interface_version_parts "${xerces_c_interface_version}")
list(GET interface_version_parts 0 INTERFACE_VERSION_MAJOR)
list(GET interface_version_parts 1 INTERFACE_VERSION_MINOR)

set(INTERFACE_VERSION_D "${INTERFACE_VERSION_MAJOR}.${INTERFACE_VERSION_MINOR}")
set(INTERFACE_VERSION_U "${INTERFACE_VERSION_MAJOR}_${INTERFACE_VERSION_MINOR}")

set(XERCES_GRAMMAR_SERIALIZATION_LEVEL "${xerces_c_grammar_serialization_level}")

set(EXTRA_DIST
  xerces-c.spec
  xerces-c.pc.in
  CREDITS
  INSTALL
  KEYS
  LICENSE
  NOTICE
  README
  config/pretty-make
  doc
  projects
  reconf
  scripts/createBindingsFormatFromHPP.pl
  scripts/makeStringDefinition.pl
  tools
)

include(GNUInstallDirs)
include(XercesWarnings)
include(XercesIncludes)
include(XercesFunctions)
include(XercesDLL)
include(XercesPathDelimiters)
include(XercesICU)
include(XercesMutexMgrSelection)
include(XercesNetAccessorSelection)
include(XercesMsgLoaderSelection)
include(XercesTranscoderSelection)
include(XercesFileMgrSelection)
include(XercesXMLCh)
include(XercesMFC)
include(XercesSSE2)
include(XercesPathMax)
include(XercesWChar)
include(XercesIconvConst)
include(XercesLFS)

# Generate headers
configure_file(
  ${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake.in
  ${CMAKE_CURRENT_BINARY_DIR}/config.h
  @ONLY)
configure_file(
  ${CMAKE_CURRENT_SOURCE_DIR}/src/xercesc/util/Xerces_autoconf_config.hpp.cmake.in
  ${CMAKE_CURRENT_BINARY_DIR}/src/xercesc/util/Xerces_autoconf_config.hpp
  @ONLY)
configure_file(
  ${CMAKE_CURRENT_SOURCE_DIR}/src/xercesc/util/XercesVersion.hpp.cmake.in
  ${CMAKE_CURRENT_BINARY_DIR}/src/xercesc/util/XercesVersion.hpp
  @ONLY)
configure_file(
  ${CMAKE_CURRENT_SOURCE_DIR}/doc/style/dtd/entities.ent.in
  ${CMAKE_CURRENT_BINARY_DIR}/doc/style/dtd/entities.ent
  @ONLY)

# Generate pkg-config file
set(pkgconfig-dir "${CMAKE_INSTALL_LIBDIR}/pkgconfig" CACHE STRING "pkg-config installation directory (default ${CMAKE_INSTALL_LIBDIR}/pkgconfig)")
set(PKGCONFIGDIR "${pkgconfig-dir}")

set(prefix "${CMAKE_INSTALL_PREFIX}")
set(exec_prefix "${CMAKE_INSTALL_PREFIX}")
set(libdir "${CMAKE_INSTALL_FULL_LIBDIR}")
set(includedir "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/xerces-c.pc.in
               ${CMAKE_CURRENT_BINARY_DIR}/xerces-c.pc)
install(
  FILES ${CMAKE_CURRENT_BINARY_DIR}/xerces-c.pc
  DESTINATION "${PKGCONFIGDIR}"
  COMPONENT "development")

# Process subdirectories
add_subdirectory(doc)
add_subdirectory(src)
add_subdirectory(tests)
add_subdirectory(samples)

# Display configuration summary
message(STATUS "")
message(STATUS "Xerces-C++ configuration summary")
message(STATUS "--------------------------------")
message(STATUS "")
message(STATUS "  Version:                   ${xerces-c_VERSION}")
message(STATUS "  Library interface version: ${xerces_c_interface_version}")
message(STATUS "")
message(STATUS "  Installation directory:    ${prefix}")
message(STATUS "  C compiler:                ${CMAKE_C_COMPILER}")
message(STATUS "  C++ compiler:              ${CMAKE_CXX_COMPILER}")
message(STATUS "")
message(STATUS "  Build shared libraries:    ${BUILD_SHARED_LIBS}")
message(STATUS "  Path delimiters:           \"${path_delims}\"")
message(STATUS "  File Manager:              ${filemgr}")
message(STATUS "  Mutex Manager:             ${mutexmgr}")
message(STATUS "  Transcoder:                ${transcoder}")
message(STATUS "  NetAccessor:               ${netaccessor}")
message(STATUS "  Message Loader:            ${msgloader}")
message(STATUS "  XMLCh type:                ${xmlch_type}")
